/**
 * @file    base_runner.hpp
 * @brief   定义基本的工作线程类
 * @author  Haozhong Xu
 * @date    2025-05-27
 * @version 1.0
 * 
 * @note    工作线程基类，其他线程都继承该类
 */
#ifndef BASE_RUNNER_H
#define BASE_RUNNER_H

#include <thread>
#include <atomic>
#include <memory>
#include <string>
#include <iostream>

/**
 * @class RunnerBase
 * @brief RunnerBase 工作线程基类
 *
 * 定义工作线程名称和初始化一个原子类型成员变量，
 * 用于控制线程执行和停止结束
 */
class RunnerBase {
public:
    RunnerBase(const std::string &name) : _name(name), _running(false) {}
    virtual ~RunnerBase() { Stop(); }

    void Start() {
        if (_running) return;
        _running = true;
        _thread = std::thread(&RunnerBase::RunWrapper, this);
    }

    void Stop() {
        if (!_running) return;
        _running = false;
        if (_thread.joinable()) _thread.join();
    }

    bool IsRunning() const { return _running.load(); }
    std::string Name() const { return _name; }

protected:
    virtual void Run() = 0; // 子类必须实现此函数

    // 私有函数，只能通过 Start 创建线程执行
private:
    void RunWrapper() {
        try {
            Run();
        } catch (const std::exception &e) {
            std::cerr << "[Runner] " << _name << " 线程异常: " << e.what() << std::endl;
        }
    }

    std::string _name;
    std::atomic<bool> _running;
    std::thread _thread;
};



#endif /* BASE_RUNNER_H */